#include "board_init.h"
#include "device.h"
#include "hal_watchdog.h"
#include "hal_sysclk.h"
#include "hal_gpio.h"
#include "hal_flash.h"
#include "hal_power.h"
#include "hal_canfd.h"
#include "hal_lockstep.h"
#include "hal_periph_clk.h"
#include "hal_sci.h"
#include "sci_stdio.h"

// 其它hal_xxx.h，如hal_can.h、hal_adc.h等
//#include "driverlib.h"
//#include "device.h" // 仅为复用部分宏定义

void board_init(void)
{
    // Initialize device clock and peripherals
    // Device_init(); decompose it to following steps：
    hal_watchdog_init(HAL_WATCHDOG_DISABLED);
#ifdef CMDTOOL
    CMD_init();
#endif
    hal_flash_init();
    hal_sysclk_init();
#ifndef _FLASH
    //
    // Call Device_cal function when run using debugger
    // This function is called as part of the Boot code. The function is called
    // in the Device_init function since during debug time resets, the boot code
    // will not be executed and the gel script will reinitialize all the
    // registers and the calibrated values will be lost.
    // Sysctl_deviceCal is a wrapper function for Device_Cal
    //
    SysCtl_deviceCal();
#endif
    hal_periph_clk_enable_all();
    hal_power_init(); // 一般在外设和系统初始化最后调用

    //hal_gpio_board_init();
    // 批量配置AGPIO为数字
    hal_gpio_set_analog_mode(12U, false);
    hal_gpio_set_analog_mode(13U, false);
    hal_gpio_set_analog_mode(20U, false);
    hal_gpio_set_analog_mode(21U, false);
    hal_gpio_set_analog_mode(28U, false);
    // 其他pinmux/上下拉/方向初始化可在此添加，如：
    // hal_gpio_set_pinmux(DEVICE_GPIO_CFG_LED1);
    // hal_gpio_set_pinmux(DEVICE_GPIO_CFG_CANRXA);


    hal_lockstep_init();

    // Initialize GPIO and configure GPIO pins for CANTX/CANRX
    // Device_initGPIO(); decompose it to following steps：
    // disable pin locks and enable pullups on GPIOs.
    hal_gpio_unlock_port(HAL_GPIO_PORT_A);
    hal_gpio_unlock_port(HAL_GPIO_PORT_B);
    hal_gpio_unlock_port(HAL_GPIO_PORT_H);
    // 此处可添加更多通用pinmux/复用/上下拉配置（如LED、CAN、SCI等）
    // 例如：配置LED灯为输出
    // GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD);
    // GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT);



    // Configure the divisor for the MCAN bit-clock
    // SysCtl_setMCANClk(SYSCTL_MCANCLK_DIV_3); decompose it to following steps
    hal_canfd_set_clk_div(HAL_CANFD_CLK_DIV_3);

    // Configuring the GPIOs for MCAN.
    // GPIO_setPinConfig(DEVICE_GPIO_CFG_MCANRXA);
    // GPIO_setPinConfig(DEVICE_GPIO_CFG_MCANTXA); decompose it to following steps
    //hal_canfd_gpio_init();  // 初始化CAN FD相关引脚的pinmux
    hal_gpio_set_pinmux(DEVICE_GPIO_CFG_MCANRXA);
    hal_gpio_set_pinmux(DEVICE_GPIO_CFG_MCANTXA);

    // 假定你LSPCLK频率为DEVICE_LSPCLK_FREQ，波特率9600



    hal_sci_init(SCIA_BASE, DEVICE_LSPCLK_FREQ, 9600);
    sci_stdio_init(SCIA_BASE); // 只做sci定位/add_device/freopen


/*  @TODO

    // 1. 禁用看门狗（推荐作为board_init第一步）
    hal_watchdog_init(HAL_WATCHDOG_DISABLED);

    // 2. 初始化flash模块
    hal_flash_init();

    // 3. 配置系统时钟 (PLL control and clock/LSPCLK dividers)
    hal_sysclk_cfg_t clk_cfg = {
        .src = HAL_SYSCLK_SRC_XTAL, // 或 HAL_SYSCLK_SRC_INTOSC
        .imult = 48,
        .refdiv = 2,
        .odiv = 4,
        .sysdiv = 1,
        .pll_enable = true,
        .freq_in_hz = DEVICE_OSCSRC_FREQ
    };
    hal_sysclk_init(&clk_cfg);

    // 4. GPIO初始化
    hal_gpio_board_init();

    // 5. 其它外设初始化（如CAN/ADC/Flash等）
    board_can_init();
    // ... 可继续添加其它外设初始化

    // 6. AGPIO数字使能（根据芯片需要）
    GPIO_setAnalogMode(12U, GPIO_ANALOG_DISABLED);
    GPIO_setAnalogMode(13U, GPIO_ANALOG_DISABLED);
    GPIO_setAnalogMode(20U, GPIO_ANALOG_DISABLED);
    GPIO_setAnalogMode(21U, GPIO_ANALOG_DISABLED);
    GPIO_setAnalogMode(28U, GPIO_ANALOG_DISABLED);

    // 7. 锁定电源寄存器（如有需要）
    ASysCtl_lockVREG();

    // 8. 启用lockstep（如有需要，可选）
    // HWREG_BP(LCM_CPU1_BASE + LCM_O_CONTROL) |= LCM_CONTROL_CMPEN;

    // 9. 打开所有外设时钟（可选，按需使能）
    // 可以遍历所有SysCtl_enablePeripheral
    // 或者单独开放board_xxx_init()
    */
}
